Network interfaces generally provide data packet transfer capabilities between a network and a host system. The host system may employ a driver module between the network interface and higher layers of an operating system or a user application/program that produces and consumes the data packets. The network interfaces typically generate an interrupt to the driver module to signal a condition that may require the attention of the driver module, for example the completion of a data transfer and/or the availability of newly received packets in a device queue. Network stack processing in the driver module then handles the delivery of packets between the device queues and the higher layers. In some instances, driver scheduling may be timer based rather than interrupt driven. In some environments, network connections may be presented by the system to the user application as an abstraction called a network socket (or just socket).
The interrupt often introduces additional latency in the transfer of packets between the network interface and user applications because it involves a context switch (generic stack processing is typically designed for higher throughput rather than lower latency). Some implementations that reduce latency employ busy-polling, by the system call processing (or the user application or the user space library on behalf of the application), on the device queue that is associated with the socket. When trying to service multiple sockets/connections, however, the effect of busy-polling degrades linearly with the number of sockets and becomes impractically inefficient as the number of sockets increases, for example above several hundred sockets.
Although the following Detailed Description will proceed with reference being made to illustrative embodiments, many alternatives, modifications, and variations thereof will be apparent to those skilled in the art.